//封装以一个SqliteHelper类，提供简单的sqlite数据库操作接口，完成数据的基础增删改查功能
//流程如下：
//     1.创建/打开数据库文件
//     2.针对打开的数据库执行操作：
//          a.表的操作
//          b.数据的操作
//     3.关闭数据库


#include <iostream>
#include <string>
#include <vector>
#include <sqlite3.h>


class SqliteHelper
{
    typedef int (*sqliteCallback)(void*, int, char**, char**);
public:
    SqliteHelper(const std::string& dbfile)
        : _dbfile(dbfile)
        , _handler(nullptr)
    {}

    bool open(int flag = SQLITE_OPEN_FULLMUTEX) //默认为串行化
    {
        //不存在则创建 | 以可读可写方式
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE  | flag, nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << "创建/打开数据库失败: ";
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

    bool exec(const std::string& sql, sqliteCallback cb, void* arg)
    {
        int ret = sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << "执行语句失败: ";
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

    void close()
    {
        if (_handler)
            sqlite3_close_v2(_handler);
    }

private:
    std::string _dbfile;
    sqlite3* _handler;
};